{
 "metadata": {
  "name": "",
  "signature": "sha256:16ec6281483cc551b1b9836b38c3c6708e0c1fb07fc427c895143491d7d56896"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "# Fault detection\n",
      "\n",
      "We'll consider a problem of identifying faults that have occurred in a system based on sensor measurements of system performance.\n",
      "\n",
      "# Topic references\n",
      "- [Samar, Sikandar, Dimitry Gorinevsky, and Stephen Boyd. \"Likelihood Bounds for Constrained Estimation with Uncertainty.\" Decision and Control, 2005 and 2005 European Control Conference. CDC-ECC'05. 44th IEEE Conference on. IEEE, 2005.](http://web.stanford.edu/~boyd/papers/pdf/map_bounds.pdf)\n",
      "\n",
      "# Problem statement\n",
      "\n",
      "Each of $n$ possible faults occurs independently with probability $p$.\n",
      "The vector $x \\in \\lbrace 0,1 \\rbrace^{n}$ encodes the fault occurrences, with $x_i = 1$ indicating that fault $i$ has occurred.\n",
      "System performance is measured by $m$ sensors.\n",
      "The sensor output is\n",
      "\\begin{equation}\n",
      "y = Ax + v = \\sum_{i=1}^n a_i x_i + v,\n",
      "\\end{equation}\n",
      "where $A \\in \\mathbf{R}^{m \\times n}$ is the sensing matrix with column $a_i$ being the **fault signature** of fault $i$,\n",
      "and $v \\in \\mathbf{R}^m$ is a noise vector where $v_j$ is Gaussian with mean 0 and variance $\\sigma^2$.\n",
      "\n",
      "The objective is to guess $x$ (which faults have occurred) given $y$ (sensor measurements).\n",
      "\n",
      "We are interested in the setting where $n > m$, that is, when we have more possible faults than measurements.\n",
      "In this setting, we can expect a good recovery when the vector $x$ is sparse.\n",
      "This is the subject of compressed sensing.\n",
      "\n",
      "# Solution approach\n",
      "To identify the faults, one reasonable approach is to choose $x \\in \\lbrace 0,1 \\rbrace^{n}$ to minimize the negative log-likelihood function\n",
      "\n",
      "\\begin{equation}\n",
      "\\ell(x) = \\frac{1}{2 \\sigma^2} \\|Ax-y\\|_2^2 +  \\log(1/p-1)\\mathbf{1}^T x + c.\n",
      "\\end{equation}\n",
      "\n",
      "However, this problem is nonconvex and NP-hard, due to the constraint that $x$ must be Boolean.\n",
      "\n",
      "To make this problem tractable, we can relax the Boolean constraints and instead constrain $x_i \\in [0,1]$.\n",
      "\n",
      "The optimization problem\n",
      "\n",
      "\\begin{array}{ll}\n",
      "\\mbox{minimize} &  \\|Ax-y\\|_2^2 + 2 \\sigma^2 \\log(1/p-1)\\mathbf{1}^T x\\\\\n",
      "\\mbox{subject to} &  0 \\leq x_i \\leq 1, \\quad i=1, \\ldots n\n",
      "\\end{array}\n",
      "\n",
      "is convex.\n",
      "We'll refer to the solution of the convex problem as the **relaxed ML** estimate.\n",
      "\n",
      "By taking the relaxed ML estimate of $x$ and rounding the entries to the nearest of 0 or 1, we recover a Boolean estimate of the fault occurrences.\n",
      "\n",
      "# Example\n",
      "\n",
      "We'll generate an example with $n = 2000$ possible faults, $m = 200$ measurements, and fault probability $p = 0.01$.\n",
      "We'll choose $\\sigma^2$ so that the signal-to-noise ratio is 5.\n",
      "That is,\n",
      "\\begin{equation}\n",
      "\\sqrt{\\frac{\\mathbf{E}\\|Ax \\|^2_2}{\\mathbf{E} \\|v\\|_2^2}} = 5.\n",
      "\\end{equation}"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import numpy as np\n",
      "import matplotlib.pyplot as plt\n",
      "\n",
      "np.random.seed(1)\n",
      "\n",
      "n = 2000\n",
      "m = 200\n",
      "p = 0.01\n",
      "snr = 5\n",
      "\n",
      "sigma = np.sqrt(p*n/(snr**2))\n",
      "A = np.random.randn(m,n)\n",
      "\n",
      "x_true = (np.random.rand(n) <= p).astype(np.int)\n",
      "v = sigma*np.random.randn(m)\n",
      "\n",
      "y = A.dot(x_true) + v"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 1
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Below, we show $x$, $Ax$ and the noise $v$."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "plt.plot(range(n),x_true)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 2,
       "text": [
        "[<matplotlib.lines.Line2D at 0x110695dd0>]"
       ]
      },
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x1106af390>"
       ]
      }
     ],
     "prompt_number": 2
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "plt.plot(range(m), A.dot(x_true),range(m),v)\n",
      "plt.legend(('Ax','v'))"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 3,
       "text": [
        "<matplotlib.legend.Legend at 0x110ee63d0>"
       ]
      },
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\nyCmXynhMtdKfatJPtzhLGluZpkJKq3ErKkZaaMGgSMd8+eXkzySS/tKlsH9/du2WVL5CIUTf0BAs\nXz521c5ckr6URZct6W/fDp/+NNxwg2ivdNNKTA8e7ZgnNOm73dDRkdm2iUo/GBRErtGMr/QrKsS2\ngUD2ZRiyVW+j1aPP1t5JDOTm2tP3+cR+y8rSe/o6nVAjE81Csdkm/sAMvx9++9v439lO0xNJP1Nf\nfzR7B+Kk73Akx4bSYaaTfjqln629MzQkxqXZnN7eueIKeP31ZJEkpWzCxJS+5OeD2M+WLaKi6VgL\nCHNl7yQKgGztnYcegm9/W+TdP/mkeM9iGd/iOeGV/t//LipgZkIwiStwAwFB+OPdfbu7BenrdHHS\nz1bpQ3YKPZ0nPhF7Z6pSNv1+sd/y8vTZO1K/TvSi8fsnvqK3owO+//3435Ml/UzSNlNTNiV7B2D+\nfKEoJaU/VfbO8SL91OydbJW+pPIhvb0zd65Q5IlqNldKH8TN5tlnx2+zdK1PFhO1d2w2WLdOlD6R\nZuyQGemf8Ep/aEhMg95/f/xtAwHReWq1GEgazfhKf7L2TrZpeOORfjb7mapAbqLST2fvSLbZREko\nEBAX5ERuGtJjChP3NVHSz88fX8FK8Y3x7J0TKZA7GaUv+fmQnvQ1mpHPsk0k/QULxCwwmz5KJH2T\nCT78UJD/WKQ/XZ6+wyHSVu+5R5T1KC5O/r9M+sSXOP/61+NvK03ztFoxqDIh/XT2zlQr/XSe+ETt\nnalQ+pKSLS0V0+TEwJI0wxivX8eC1FdO58TamXjcySh9g2H8nG6pb3Nh70wmT18iqUwWHk0UY3n6\nmZJ+b6/oB0hv70i+deKzhRNJX6sVwfFsFmmlKn29Hi66aHzSn47snU2b4IEHRBu/852R/7daxyZ9\nKdnkhCb94WH44hfFY+j6+8feNh3pj3f37ekRCm2i9k62F/Joee7SBReJZOYL5jqQm1h7R7J3tFox\nHd+zJ7n9arX432TsHZiYxZNLpa/Xj9930v9Hs3fq6sTDQvr7x7d3Jqv0E39OBcbK3snU3rHbhVqF\nkYHyTJQ+ZO/rpyr9tWuhpGTsfP3pUvper2jfb38L9fUj/z+e0k8skzKVmHalX1MD558PW7eOva0U\nvJVIP5NArtMpZhKTyd6B7AK5o9k7Ol18xjEepkLp5+cnB3IBPvMZeOqp5PZL9s5klX4uSH+qlf5o\n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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x110ee6d50>"
       ]
      }
     ],
     "prompt_number": 3
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "# Recovery\n",
      "\n",
      "We solve the relaxed maximum likelihood problem with CVXPY and then round the result to get a Boolean solution."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%time\n",
      "from cvxpy import *\n",
      "x = Variable(shape=(n,1))\n",
      "tau = 2*log(1/p - 1)*sigma**2\n",
      "obj = Minimize(sum_squares(A*x - y) + tau*sum(x))\n",
      "const = [0 <= x, x <= 1]\n",
      "Problem(obj,const).solve(verbose=True)\n",
      "\n",
      "# relaxed ML estimate\n",
      "x_rml = np.array(x.value).flatten()\n",
      "\n",
      "# rounded solution\n",
      "x_rnd = (x_rml >= .5).astype(int)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "ECOS 1.0.4 - (c) A. Domahidi, Automatic Control Laboratory, ETH Zurich, 2012-2014.\n",
        "\n",
        "It     pcost         dcost      gap     pres    dres     k/t     mu      step     IR\n",
        " 0   +7.127e+03   -6.144e+04   +8e+05   8e+00   1e-01   1e+00   2e+02    N/A     1 1 -\n",
        " 1   +7.014e+02   -1.137e+04   +4e+05   1e+00   2e-02   4e+01   1e+02   0.9899   1 1 1\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        " 2   +5.300e+01   -1.510e+03   +9e+04   2e-01   2e-03   2e+01   2e+01   0.9406   2 1 1\n",
        " 3   +1.140e+02   -7.533e+02   +5e+04   1e-01   1e-03   1e+01   1e+01   0.5426   2 2 2\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        " 4   +1.378e+02   -3.905e+02   +3e+04   6e-02   8e-04   5e+00   8e+00   0.5017   2 2 2\n",
        " 5   +1.391e+02   -2.656e+02   +3e+04   5e-02   6e-04   3e+00   7e+00   0.4344   2 2 1\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        " 6   +1.645e+02   +8.938e+00   +1e+04   2e-02   2e-04   9e-01   3e+00   0.6950   2 2 2\n",
        " 7   +1.740e+02   +7.476e+01   +6e+03   1e-02   2e-04   5e-01   2e+00   0.5070   2 2 2\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        " 8   +1.739e+02   +7.682e+01   +6e+03   1e-02   2e-04   4e-01   2e+00   0.0978   3 2 1\n",
        " 9   +1.844e+02   +1.482e+02   +2e+03   4e-03   6e-05   2e-02   6e-01   0.9899   2 2 2\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "10   +1.889e+02   +1.755e+02   +9e+02   2e-03   2e-05   9e-03   2e-01   0.7568   2 2 2\n",
        "11   +1.907e+02   +1.864e+02   +3e+02   5e-04   7e-06   3e-03   7e-02   0.8071   2 2 2\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "12   +1.912e+02   +1.892e+02   +1e+02   2e-04   3e-06   1e-03   3e-02   0.8099   2 2 2\n",
        "13   +1.914e+02   +1.906e+02   +6e+01   1e-04   1e-06   5e-04   1e-02   0.7158   3 2 2\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "14   +1.916e+02   +1.912e+02   +3e+01   4e-05   6e-07   2e-04   6e-03   0.8640   3 1 1\n",
        "15   +1.916e+02   +1.916e+02   +4e+00   7e-06   9e-08   3e-05   1e-03   0.8722   3 2 2\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "16   +1.916e+02   +1.916e+02   +4e-01   7e-07   1e-08   4e-06   1e-04   0.9258   2 2 2\n",
        "17   +1.916e+02   +1.916e+02   +6e-02   1e-07   2e-09   5e-07   2e-05   0.8804   3 2 2\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "18   +1.916e+02   +1.916e+02   +2e-02   4e-08   5e-10   2e-07   5e-06   0.7988   3 3 3\n",
        "19   +1.916e+02   +1.916e+02   +3e-03   6e-09   8e-11   3e-08   8e-07   0.9092   3 3 3\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "20   +1.916e+02   +1.916e+02   +5e-04   9e-10   1e-11   5e-09   1e-07   0.9134   3 2 2\n",
        "21   +1.916e+02   +1.916e+02   +1e-04   2e-10   2e-12   9e-10   3e-08   0.8726   3 2 1\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "22   +1.916e+02   +1.916e+02   +1e-05   2e-11   3e-13   1e-10   4e-09   0.9512   2 1 1\n",
        "\n",
        "OPTIMAL (within feastol=2.5e-11, reltol=7.3e-08, abstol=1.4e-05).\n",
        "Runtime: 4.225071 seconds.\n",
        "\n",
        "CPU times: user 4.66 s, sys: 123 ms, total: 4.78 s\n",
        "Wall time: 4.97 s\n"
       ]
      }
     ],
     "prompt_number": 4
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "# Evaluation\n",
      "\n",
      "We define a function for computing the estimation errors, and a function for plotting $x$, the relaxed ML estimate, and the rounded solutions."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import matplotlib\n",
      "\n",
      "def errors(x_true, x, threshold=.5):\n",
      "    '''Return estimation errors.\n",
      "    \n",
      "    Return the true number of faults, the number of false positives, and the number of false negatives.\n",
      "    '''\n",
      "    n = len(x_true)\n",
      "    k = sum(x_true)\n",
      "    false_pos = sum(np.logical_and(x_true < threshold, x >= threshold))\n",
      "    false_neg = sum(np.logical_and(x_true >= threshold, x < threshold))\n",
      "    return (k, false_pos, false_neg)\n",
      "\n",
      "def plotXs(x_true, x_rml, x_rnd, filename=None):\n",
      "    '''Plot true, relaxed ML, and rounded solutions.'''\n",
      "    matplotlib.rcParams.update({'font.size': 14})\n",
      "    xs = [x_true, x_rml, x_rnd]\n",
      "    titles = ['x_true', 'x_rml', 'x_rnd']\n",
      "\n",
      "    n = len(x_true)\n",
      "    k = sum(x_true)\n",
      "\n",
      "    fig, ax = plt.subplots(1, 3, sharex=True, sharey=True, figsize=(12, 3))\n",
      "\n",
      "    for i,x in enumerate(xs):\n",
      "            ax[i].plot(range(n), x)\n",
      "            ax[i].set_title(titles[i])\n",
      "            ax[i].set_ylim([0,1])\n",
      "            \n",
      "    if filename:\n",
      "        fig.savefig(filename, bbox_inches='tight')\n",
      "        \n",
      "    return errors(x_true, x_rml,.5)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 5
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "We see that out of 20 actual faults, the rounded solution gives perfect recovery with 0 false negatives and 0 false positives."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "plotXs(x_true, x_rml, x_rnd, 'fault.pdf')"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 6,
       "text": [
        "(20, 0, 0)"
       ]
      },
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x110f77990>"
       ]
      }
     ],
     "prompt_number": 6
    }
   ],
   "metadata": {}
  }
 ]
}